home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / api_shar / shareb.c < prev    next >
Text File  |  1989-01-25  |  4KB  |  153 lines

  1. /****************************************************************
  2. *
  3. *  Name:          SHAREB
  4. *
  5. *  Function:      share memory/data among multiple processes
  6. *
  7. *  Shows how to:  1. read from and write to shared memory.
  8. *                 2. receive from another process the address of shared data.
  9. *                 3. control access to shared data via mailbox semaphore.
  10. *
  11. *  Written by:    Larry Rush, Quarterdeck Office Systems
  12. *
  13. *  Contact:       Voice:  (213) 392-9851, (213) 392-9701
  14. *                 BBS:    (213) 396-3904, (213) 392-2278
  15. *                 Fax:    (213) 399-3802
  16. *
  17. ****************************************************************/
  18.  
  19. #include <stdio.h>
  20. #include "dvapi.h"
  21.  
  22. /* minimum API version required */
  23. #define required 0x201
  24.  
  25. /* arbitrary # times to read/write shared memory */
  26. #define REPS 4
  27.  
  28. /* API version number */
  29. int version;
  30.  
  31. /* default object handle */
  32. ulong win;
  33.  
  34. /* application handle of other process */
  35. ulong apphana;
  36.  
  37. /* mail-related variables */
  38. int status;
  39. int mallng;
  40.  
  41. /* read/write loop control variable */
  42. int i;
  43.  
  44. /* type declarations related to shared data */
  45. /*i* typedef int datatype; *i*/
  46. typedef char datatype[11];
  47. /*r* struct datatype { *r*/
  48.   /*r* struct datatype *link; *r*/
  49.   /*r* int lng; *r*/
  50.   /*r* char data[11]; *r*/
  51.   /*r* }; *r*/
  52.  
  53. /* type declaration of pointer to shared data */
  54. /*i* typedef datatype *dataptr; *i*/
  55. typedef datatype *dataptr; 
  56. /*r* typedef struct datatype *dataptr; *r*/
  57.  
  58. /* constant value to be assigned to shared memory */
  59. /*i* datatype shrconst = 22222; *i*/
  60. datatype shrconst = "     BBBBB"; 
  61. /*r* struct datatype shrconst = { *r*/
  62.   /*r* NULL, *r*/
  63.   /*r* 22222, *r*/
  64.   /*r* "     BBBBB" *r*/
  65.   /*r* }; *r*/
  66.  
  67. /* pointer to shared data */
  68. dataptr bufptr;
  69.  
  70. /* pointer to pointer to shared data */
  71. dataptr *bufptrptr;
  72.  
  73. /* mailbox semaphore controlling access to shared memory */
  74. ulong sema;
  75.  
  76. /* global name of mailbox semaphore */
  77. char name[] = "Shared Memory Semaphore";
  78.  
  79.  
  80. /**********************************************************************
  81. *  main  -  check for DESQview present and enable required extensions.
  82. ***********************************************************************/
  83.  
  84. main () {
  85.   /* initialize C interfaces and get API version number */
  86.   version = api_init();
  87.  
  88.   /* if DESQview is not running or version is too low, display a message */
  89.   if (version < required) {
  90.     printf ("This program requires DESQview version %d.02%d or later.\n",
  91.              required/256,required%256);
  92.     }
  93.  
  94.   else {
  95.     /* tell DESQview what extensions to enable and start application */
  96.     api_level (required);
  97.     program_body();
  98.  
  99.     /* disable C interfaces and return from program */
  100.     api_exit();
  101.     }
  102.  
  103.   }
  104.  
  105.  
  106. /********************************************************************
  107. /*  program_body
  108. /********************************************************************/
  109.  
  110. program_body () {
  111.  
  112.   /* get object handle */
  113.   win = win_me();
  114.  
  115.   /* find named mailbox semaphore */
  116.   sema = mal_find (name,sizeof (name));
  117.  
  118.   /* read pointer to mailed data */
  119.   status = mal_read (mal_me(),&bufptrptr,&mallng);
  120.  
  121.   /* assign pointer to shared data by dereferencing pointer to pointer */
  122.   bufptr = *bufptrptr;
  123.  
  124.   /* get the application task handle of other process */
  125.   apphana = mal_addr (mal_me());
  126.  
  127.   /* loop till handle of other process is no longer valid */
  128.   while (api_isobj (apphana)) {
  129.  
  130.     /* lock semaphore */
  131.     mal_lock (sema);
  132.  
  133.     /* loop REPS times */
  134.     for (i = 1; i <= REPS; i++) {
  135.  
  136.       /* read & display current contents & address of shared data */
  137.       /*i* win_printf (win,"%i at %Fp\n",*bufptr,bufptr); *i*/
  138.       win_printf (win,"%s at %Fp\n",bufptr,bufptr); 
  139.       /*r* win_printf (win,"%i %s at %Fp\n",bufptr->lng,bufptr->data,bufptr); *r*/
  140.  
  141.       /* modify contents of shared data */
  142.       /*i* *bufptr = shrconst; *i*/
  143.       strcpy (bufptr,shrconst);
  144.       /*r* bufptr->lng = shrconst.lng; *r*/
  145.       /*r* strcpy (bufptr->data,shrconst.data); *r*/
  146.       }
  147.  
  148.     /* unlock semaphore */
  149.     mal_unlock (sema);
  150.     }
  151.  
  152.   }
  153.